package site.wlwsjsx.iot_backend.controller;

import com.auth0.jwt.interfaces.DecodedJWT;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import site.wlwsjsx.iot_backend.service.WorkStationService;
import site.wlwsjsx.iot_backend.utils.JWTUtil;
import site.wlwsjsx.iot_backend.utils.JsonResultUtil;

@RestController
@RequestMapping("/workstation")
public class WorkStationController {
    private static final Logger log = LoggerFactory.getLogger(WorkStationController.class);
    @Resource
    WorkStationService workStationService;

    @PostMapping("set/powerStatus")
    public JsonResultUtil<Object> setPowerStatusByStaCode(HttpServletRequest request,
                                                          @Param("workstationCode") String workstationCode,
                                                          @Param("powerStatus") String powerStatus) {
        // 从请求头获取token
        String token = request.getHeader("Authorization");
        log.info("开始处理设置工作站电源状态请求 - 工作站代码: {}, 电源状态: {}", workstationCode, powerStatus);

        JsonResultUtil<Object> result = new JsonResultUtil<>();

        try {
            // 验证token是否存在
            if (token == null || token.isEmpty()) {
                log.warn("设置工作站电源状态失败 - 原因: 缺少认证令牌");
                result.setState(4000);
                result.setMessage("缺少认证令牌");
                return result;
            }

            // 验证token并获取用户信息
            log.debug("开始验证token");
            DecodedJWT decodedJWT = JWTUtil.getTokenInfo(token);
            Integer role = Integer.parseInt(decodedJWT.getClaim("role").asString());

            // 检查用户角色是否为管理员
            if (role == null || role != 2) { // 假设2代表管理员角色
                log.warn("设置工作站电源状态失败 - 原因: 用户权限不足，当前角色: {}", role);
                result.setState(4003);
                result.setMessage("权限不足，只有管理员可以执行此操作");
                return result;
            }

            log.debug("token验证成功，用户角色: {}", role);

            // 解析电源状态参数
            int status;
            try {
                status = Integer.parseInt(powerStatus) == 0 ? 0 : 1;
                log.debug("解析电源状态成功: {}", status);
            } catch (NumberFormatException e) {
                log.warn("设置工作站电源状态失败 - 原因: 电源状态参数格式错误");
                result.setState(4001);
                result.setMessage("参数错误，电源状态必须是0或1");
                return result;
            }

            // 执行设置电源状态操作
            log.debug("开始设置工作站电源状态 - 工作站代码: {}, 状态: {}", workstationCode, status);
            workStationService.setPowerStatusByWorStaCode(workstationCode, status);

            log.info("设置工作站电源状态成功 - 工作站代码: {}, 电源状态: {}", workstationCode, status);
            result.setState(200);
            result.setMessage("设置成功");
            return result;
        } catch (Exception e) {
            log.error("设置工作站电源状态失败 - 工作站代码: {}, 错误信息: {}", workstationCode, e.getMessage(), e);
            result.setState(5000);
            result.setMessage("服务器内部错误");
            return result;
        }
    }

    @PostMapping("set/lightStatus")
    public JsonResultUtil<Object> setLightStatusByStaCode(HttpServletRequest request,
                                                          @Param("workstationCode") String workstationCode,
                                                          @Param("lightStatus") String lightStatus) {
        // 从请求头获取token
        String token = request.getHeader("Authorization");
        log.info("开始处理设置工作站灯光状态请求 - 工作站代码: {}, 灯光状态: {}", workstationCode, lightStatus);

        JsonResultUtil<Object> result = new JsonResultUtil<>();

        try {
            // 验证token是否存在
            if (token == null || token.isEmpty()) {
                log.warn("设置工作站灯光状态失败 - 原因: 缺少认证令牌");
                result.setState(4000);
                result.setMessage("缺少认证令牌");
                return result;
            }

            // 验证token并获取用户信息
            log.debug("开始验证token");
            DecodedJWT decodedJWT = JWTUtil.getTokenInfo(token);
            Integer role = Integer.parseInt(decodedJWT.getClaim("role").asString());

            // 检查用户角色是否为管理员
            if (role == null || role != 2) { // 假设2代表管理员角色
                log.warn("设置工作站灯光状态失败 - 原因: 用户权限不足，当前角色: {}", role);
                result.setState(4003);
                result.setMessage("权限不足，只有管理员可以执行此操作");
                return result;
            }

            log.debug("token验证成功，用户角色: {}", role);

            // 解析灯光状态参数
            int status;
            try {
                status = Integer.parseInt(lightStatus) == 0 ? 0 : 1;
                log.debug("解析灯光状态成功: {}", status);
            } catch (NumberFormatException e) {
                log.warn("设置工作站灯光状态失败 - 原因: 灯光状态参数格式错误");
                result.setState(4001);
                result.setMessage("参数错误，灯光状态必须是0或1");
                return result;
            }

            // 执行设置灯光状态操作
            log.debug("开始设置工作站灯光状态 - 工作站代码: {}, 状态: {}", workstationCode, status);
            workStationService.setLightStatusByWorStaCode(workstationCode, status);

            log.info("设置工作站灯光状态成功 - 工作站代码: {}, 灯光状态: {}", workstationCode, status);
            result.setState(200);
            result.setMessage("设置成功");
            return result;
        } catch (Exception e) {
            log.error("设置工作站灯光状态失败 - 工作站代码: {}, 错误信息: {}", workstationCode, e.getMessage(), e);
            result.setState(5000);
            result.setMessage("服务器内部错误");
            return result;
        }
    }

    @PostMapping("set/relayNum1Status")
    public JsonResultUtil<Object> setRelayNum1StatusByStaCode(HttpServletRequest request,
                                                              @Param("workstationCode") String workstationCode,
                                                              @Param("relayNum1Status") String relayNum1Status) {
        // 从请求头获取token
        String token = request.getHeader("Authorization");
        log.info("开始处理设置工作站继电器1状态请求 - 工作站代码: {}, 继电器1状态: {}", workstationCode, relayNum1Status);

        JsonResultUtil<Object> result = new JsonResultUtil<>();

        try {
            // 验证token是否存在
            if (token == null || token.isEmpty()) {
                log.warn("设置工作站继电器1状态失败 - 原因: 缺少认证令牌");
                result.setState(4000);
                result.setMessage("缺少认证令牌");
                return result;
            }

            // 验证token并获取用户信息
            log.debug("开始验证token");
            DecodedJWT decodedJWT = JWTUtil.getTokenInfo(token);
            Integer role = Integer.parseInt(decodedJWT.getClaim("role").asString());

            // 检查用户角色是否为管理员
            if (role == null || role != 2) { // 假设2代表管理员角色
                log.warn("设置工作站继电器1状态失败 - 原因: 用户权限不足，当前角色: {}", role);
                result.setState(4003);
                result.setMessage("权限不足，只有管理员可以执行此操作");
                return result;
            }

            log.debug("token验证成功，用户角色: {}", role);

            // 解析继电器1状态参数
            int status;
            try {
                status = Integer.parseInt(relayNum1Status) == 0 ? 0 : 1;
                log.debug("解析继电器1状态成功: {}", status);
            } catch (NumberFormatException e) {
                log.warn("设置工作站继电器1状态失败 - 原因: 继电器1状态参数格式错误");
                result.setState(4001);
                result.setMessage("参数错误，继电器1状态必须是0或1");
                return result;
            }

            // 执行设置继电器1状态操作
            log.debug("开始设置工作站继电器1状态 - 工作站代码: {}, 状态: {}", workstationCode, status);
            workStationService.setRelayNum1StatusByWorStaCode(workstationCode, status);

            log.info("设置工作站继电器1状态成功 - 工作站代码: {}, 继电器1状态: {}", workstationCode, status);
            result.setState(200);
            result.setMessage("设置成功");
            return result;
        } catch (Exception e) {
            log.error("设置工作站继电器1状态失败 - 工作站代码: {}, 错误信息: {}", workstationCode, e.getMessage(), e);
            result.setState(5000);
            result.setMessage("服务器内部错误");
            return result;
        }
    }

    @PostMapping("set/relayNum2Status")
    public JsonResultUtil<Object> setRelayNum2StatusByStaCode(HttpServletRequest request,
                                                              @Param("workstationCode") String workstationCode,
                                                              @Param("relayNum2Status") String relayNum2Status) {
        // 从请求头获取token
        String token = request.getHeader("Authorization");
        log.info("开始处理设置工作站继电器2状态请求 - 工作站代码: {}, 继电器2状态: {}", workstationCode, relayNum2Status);

        JsonResultUtil<Object> result = new JsonResultUtil<>();

        try {
            // 验证token是否存在
            if (token == null || token.isEmpty()) {
                log.warn("设置工作站继电器2状态失败 - 原因: 缺少认证令牌");
                result.setState(4000);
                result.setMessage("缺少认证令牌");
                return result;
            }

            // 验证token并获取用户信息
            log.debug("开始验证token");
            DecodedJWT decodedJWT = JWTUtil.getTokenInfo(token);
            Integer role = Integer.parseInt(decodedJWT.getClaim("role").asString());

            // 检查用户角色是否为管理员
            if (role == null || role != 2) { // 假设2代表管理员角色
                log.warn("设置工作站继电器2状态失败 - 原因: 用户权限不足，当前角色: {}", role);
                result.setState(4003);
                result.setMessage("权限不足，只有管理员可以执行此操作");
                return result;
            }

            log.debug("token验证成功，用户角色: {}", role);

            // 解析继电器2状态参数
            int status;
            try {
                status = Integer.parseInt(relayNum2Status) == 0 ? 0 : 1;
                log.debug("解析继电器2状态成功: {}", status);
            } catch (NumberFormatException e) {
                log.warn("设置工作站继电器2状态失败 - 原因: 继电器2状态参数格式错误");
                result.setState(4001);
                result.setMessage("参数错误，继电器2状态必须是0或1");
                return result;
            }

            // 执行设置继电器2状态操作
            log.debug("开始设置工作站继电器2状态 - 工作站代码: {}, 状态: {}", workstationCode, status);
            workStationService.setRelayNum2StatusByWorStaCode(workstationCode, status);

            log.info("设置工作站继电器2状态成功 - 工作站代码: {}, 继电器2状态: {}", workstationCode, status);
            result.setState(200);
            result.setMessage("设置成功");
            return result;
        } catch (Exception e) {
            log.error("设置工作站继电器2状态失败 - 工作站代码: {}, 错误信息: {}", workstationCode, e.getMessage(), e);
            result.setState(5000);
            result.setMessage("服务器内部错误");
            return result;
        }
    }



    @GetMapping("/test")
    public String test(String s) {
        return "Hello ," + s;
    }
}
